package com.thread.threadfirst.javaBase.java8;

import com.thread.threadfirst.javaBase.Inter;
import org.apache.logging.log4j.util.Strings;

import java.util.*;
import java.util.stream.Collectors;

/**
 * stream
 */
public class StreamTest {

    public static void main(String[] args) {

        List<String> list= Arrays.asList("luffy","zoro","sanji","nami");
        //Collectors 类实现了很多归约操作，例如将流转换成集合和聚合元素。Collectors可用于返回列表或字符串：
        List<String> collect = list.stream().filter(str -> !Strings.isEmpty(str)).collect(Collectors.toList());
        System.out.println("筛选列表: " + collect);
        String collect2 = list.stream().filter(str -> !Strings.isEmpty(str)).collect(Collectors.joining(","));
        System.out.println("合并字符串: " + collect2);
        System.out.println("==============Collectors================");

        //filter 方法用于通过设置条件过滤出元素。以下代码片段使用filter 方法过滤出空字符串：
        long count = list.stream().filter(String::isEmpty).count();
        System.out.println("empty count= " + count);
        System.out.println("==============filter================");

        Random random=new Random();
        //limit 方法用于获取指定数量的流。以下代码片段使用 limit 方法打印出 10 条数据：
        random.ints().limit(10).forEach(System.out::println);
        System.out.println("==============forEach================");

        //sorted 方法用于对流进行排序。以下代码片段使用 sorted 方法对输出的 10 个随机数进行排序：
        random.ints().limit(10).sorted().forEach(System.out::println);
        System.out.println("==============sorted================");

        //map 方法用于映射每个元素到对应的结果，以下代码片段使用 map 输出了元素对应的平方数：
        List<Integer> list1= Arrays.asList(1,2,3,4,5);
        List<Integer> collect1 = list1.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        System.out.println(collect1);
        System.out.println("==============map================");

        List<String> list2 = Arrays.asList("luffy","zoro","sanji","","nami");
        Long start = System.currentTimeMillis();
        Long count1 = list2.stream().filter(str -> Strings.isEmpty(str)).count();
        Long end = System.currentTimeMillis();
        System.out.println("stream " + count1 + " spend time: " + (end-start));

        //parallelStream 是流并行处理程序的代替方法。以下实例我们使用parallelStream 来输出空字符串的数量：
        Long start1 = System.currentTimeMillis();
        Long count2 = list2.parallelStream().filter(str -> Strings.isEmpty(str)).count();
        Long end1 = System.currentTimeMillis();
        System.out.println("parallelStream " + count2 + " spend time: " + (end1-start1));
        System.out.println("==============parallelStream================");

        //另外，一些产生统计结果的收集器也非常有用。它们主要用于int、double、long等基本类型上，它们可以用来产生类似如下的统计结果。
        List<Integer> nums=Arrays.asList(3,4,6,8,1,5);
        IntSummaryStatistics stats = nums.stream().mapToInt(n -> n).summaryStatistics();
        System.out.println("列表中最大的数 : " + stats.getMax());
        System.out.println("列表中最小的数 : " + stats.getMin());
        System.out.println("所有数之和 : " + stats.getSum());
        System.out.println("平均数 : " + stats.getAverage());
        System.out.println("==============parallelStream================");

        Random random1 = new Random(10);
        Random random2 = new Random(10);
        System.out.println(random1.nextInt()); // -1157793070
        System.out.println(random2.nextInt()); // -1157793070

        System.out.println("==============随机数================");
        Random random3=new Random();
        random3.ints().limit(10).forEach(System.out::println);


    }
}
